package fiuba.algo3.vista;

import java.awt.Color;
import java.util.Iterator;

import javax.swing.*;

import fiuba.algo3.control.Controlador;
import fiuba.algo3.modelo.Posicion;
import fiuba.algo3.modelo.mapa.Mapa;

@SuppressWarnings("serial")
public class GraficoMapa extends JInternalFrame{
	static private int ANCHOCALLE = 15;
	static private int ANCHOMANZANA = 35;
	
	private Controlador controlador;
	private JFPrincipal principal;
	private Mapa mapa;
	private int ancho;
	private int alto;
	private int maxWidth;
	private int maxHeight;
	private GSorpresasObstaculos sorpresasYObstaculos;
	private GManzanas manzanasB;
	private Iterator<JLabel> iterador;
	private JLabel vehiculo, meta;
	private Niebla niebla;
	
	public GraficoMapa(int maxWidth,int maxHeight,JFPrincipal principal,Controlador controlador) {
		this.principal = principal;
		this.controlador = controlador;
		this.mapa = controlador.getMapa();
		this.ancho = mapa.getAncho()-1;
		this.alto = mapa.getAlto()-1;
		this.maxHeight = maxHeight;
		this.maxWidth = maxWidth;
		
		setLayout(null);
		
		//elimar bordes y northPane
		this.setBorder(null);
		javax.swing.plaf.InternalFrameUI ifu= this.getUI();
		((javax.swing.plaf.basic.BasicInternalFrameUI)ifu).setNorthPane(null);
		
		//setear y dimensiones. del fondo del mapa (calles)
		this.setSize((ancho*(ANCHOCALLE + ANCHOMANZANA))+ANCHOCALLE,(alto*(ANCHOCALLE + ANCHOMANZANA))+ANCHOCALLE);
		
		//centrar posicion
		this.setLocation((maxWidth-(ancho*(ANCHOCALLE + ANCHOMANZANA)))/2,(maxHeight-(alto*(ANCHOCALLE + ANCHOMANZANA)))/2);
		this.setBackground(new Color(214,214,214));

		//CREAR LA META
		Imagenes imagePath = new Imagenes();
		ImageIcon icon;
		
		Posicion posicionMeta = controlador.getPosicionMeta();
		icon = createImageIcon("meta.png");
		
		meta = new JLabel(icon);
		meta.setBounds((posicionMeta.getX()*50),(posicionMeta.getY()*50),icon.getIconWidth(),icon.getIconHeight());
		meta.setVisible(true);
		this.add(meta);

		//CREAR EL VEHICULO
		Posicion posicionVehiculo = controlador.getPosicionVehiculo();
		icon = createImageIcon(imagePath.getImagenDe(controlador.getTipoDeVehiculo().getClass()));
		
		vehiculo = new JLabel(icon);
		vehiculo.setBounds((posicionVehiculo.getX()*50),(posicionVehiculo.getY()*50),vehiculo.getIcon().getIconWidth(),vehiculo.getIcon().getIconHeight());
		vehiculo.setVisible(true);
		this.add(vehiculo);
		
		//crearNiebla
		niebla = new Niebla(0,0,maxWidth,maxHeight);
		this.actualizarNiebla((posicionVehiculo.getX()*50),(posicionVehiculo.getY()*50));
		iterador = niebla.getMargenes().iterator();
		while(iterador.hasNext()){
			this.add(iterador.next());
		}
		
		
		//crear sorpresas y obstaculos.
		crearSorpresasYObstaculos();		
		
		//crear manzanas
		manzanasB = new GManzanas(ancho,alto);
		iterador = manzanasB.getManzanas().iterator();
		while (iterador.hasNext()){
			this.add(iterador.next());
		}

	}

	public void actualizar(){
		
		actualizarVehiculo();
		
		principal.actualizarDatosDeJuego();
		
		this.actualizarSorpresasYObstaculos();
	}

	private void crearSorpresasYObstaculos() {
		sorpresasYObstaculos = new GSorpresasObstaculos(maxWidth,maxHeight,mapa);
		iterador = sorpresasYObstaculos.getSorpresasYObstaculos().iterator();
		while(iterador.hasNext()){
			this.add(iterador.next());
		}
	}
	
	private void actualizarSorpresasYObstaculos(){
		this.iterador = this.sorpresasYObstaculos.getSorpresasYObstaculos().iterator();
		while(iterador.hasNext()){
			iterador.next().setVisible(false);
		}
		this.crearSorpresasYObstaculos();
	}

	private void actualizarNiebla(int x, int y) {
		//remover niebla
		iterador = niebla.getMargenes().iterator();
		while(iterador.hasNext()){
			iterador.next().setVisible(false);
		}		
		//crearNiebla
		niebla = new Niebla(x,y,maxWidth,maxHeight);
		iterador = niebla.getMargenes().iterator();
		while(iterador.hasNext()){
			this.add(iterador.next());
		}
	
	}

	private void actualizarVehiculo() {
		Posicion posicionVehiculo = controlador.getPosicionVehiculo();
		Imagenes imagePath = new Imagenes();
		vehiculo.setIcon(createImageIcon(imagePath.getImagenDe(controlador.getTipoDeVehiculo().getClass())));
		int newX = posicionVehiculo.getX()*50;
		int newY = posicionVehiculo.getY()*50;
		vehiculo.setLocation(newX,newY);
		this.add(vehiculo);
		this.actualizarNiebla(newX,newY);
		
	}
	
	private ImageIcon createImageIcon(String path) {
		java.net.URL imgURL = getClass().getResource("images/"+path);
		if (imgURL != null) {
			return new ImageIcon(imgURL);
		} else {
			System.err.println("no se pudo encontrar la ruta: images/" + path);
			return null;
		}
	}
}
